PROFDINFO.COM

Votre enseignant d'informatique en ligne

Section 1 - Introduction à bash

et aux commandes de base

Retour à la page du cours

La section 1 vous présentera rapidement le système d'exploitation Linux, particulièrement bash, l'interpréteur de commandes avec lequel nous travaillerons tout au long de la session. Vous y verrez quelques commandes de base fort utile pour jouer dans le système de fichiers.

1.1 - Concepts de base

1.2 - Commandes de base - résumé rapide

1.3 - Système de fichiers - notions préliminaire

1.4 - Deux commandes de base en plus de détails (cd et ls)

1.5 - Permissions

1.6 - Les liens

1.7 - Les jokers

1.8 - Les redirections

1.1 - Concepts de base

 

1.1.1 - L'administrateur: root

Sous Linux, par défaut, un seul compte a pouvoir de vie ou de mort sur le système, pouvant tout faire, contourner toutes les permissions du système de fichiers, pouvant gérer les usagers et leurs mots de passe ainsi qu'administrer le serveur. C'est grosso-modo l'équivalent du compte Administrateur sous Windows, en Linux/Unix on l'appelle root. Lorsque vous êtes logués en root, vous pouvez tout faire. Mais n'oubliez jamais qu'à grand pouvoir correspond grande responsabilité, comme disait l'autre. Si en tant que root vous pouvez tout faire, vous pouvez donc faire énormément de dégâts sur un système par simple distraction.

Il est donc fortement recommandé aux administrateurs de se créer un compte personnel "ordinaire" qu'ils utiliseront pour leurs tâches de tous les jours. Ils n'utiliseront le compte root qu'à quelques moments périodiques, lorsqu'il n'auront pas le choix, pour des tâches administratives.

La majorité des distributions de Linux vous demanderont, à l'installation, de définir le mot de passe du compte root, puis de vous créer un compte ordinaire.

Ubuntu toutefois, diffère quant à sa philosophie d'usage du root. Vous vous rappellerez sans doute qu'on ne vous a jamais demandé de définir le mot de passe du compte root. Comment allez-vous pouvoir vous y loguer?

Pour l'instant, vous ne le pouvez pas - vous devrez vous loguer sur le système en utilisant votre compte "ordinaire". La raison est simple: par défaut le compte root est désactivé et n'a donc pas de mot de passe. Ainsi, quelqu'un qui tente d'en trouver le mot de passe pour s'approprier le serveur est voué à l'échec dès le départ.

Pour les moments où vous aurez tout de même besoin d'un accès root, vous pourrez utiliser la commande sudo. sudo signifie "super user do" (ou "faire en tant que super usager" - donc en tant que root). Il suffit de préfixer toute commande d'administration de la commande sudo et vous l'exécutez comme si vous étiez root. Par exemple:

Ceci éteindra votre ordinateur dès maintenant, commande qui demande évidemment d'être root. sudo vous demandra simplement d'entrer votre mot de passe (le vôtre, pas celui de root).

Pour pouvoir utiliser sudo, il faut que notre nom soit présent dans le fichier /etc/sudoers (que l'on ne devrait éditer qu'avec la commande visudo et non à la main - on y reviendra un jour). Pour l'instant les seuls comptes qui sont dans le ficiher /etc/sudoers sont ceux qui font partie du groupe admin - votre compte est le seul membre de ce groupe, mais vous pourrez éventuellement en ajouter d'autres.

Les avantages d'un compte root désactivé et de l'usage de sudo:

  • Quelqu'un qui tente de trouver le mot de passe de l'administrateur devra en plus trouver son login, qui ne sera pas toujours le même d'un système à l'autre;
  • Le fait de préfixer chaque commande d'administration de la commande sudo évite de faire des gaffes alors qu'on est logué en tant que root et qu'on l'oublie;
  • On peut aisément partager les tâches administratives en plusieurs comptes - il suffit d'ajouter des gens dans le groupe admin, sans besoin de partager un compte commun;
  • Les commandes exécutées par sudo sont loguées dans le fichier /var/log/auth.log, ce qui permet aisément de savoir qui a fait quoi à quel moment;
  • Les administrateurs n'ont pas à retenir deux mots de passe séparés;
  • La sécurité d'accès à sudo est aussi évolué que la sécurité d'accès au compte root.

Si vous en avez assez de devoir taper sudo avant chaque commande que vous faites, dans le cas où vous en avez plusieurs à entrer une après l'autre, vous pouvez contourner cette limitation en faisant sudo -i ce qui vous fera basculer en mode root jusqu'à ce que vous tapiez exit. Toutefois, bien que ça soit souvent plus pratique, c'est en faisant ça qu'on fait parfois des gaffes donc gardez l'oeil ouvert.

On verra également plus tard comment réactiver le compte root et désactiver le sudo si jamais cette stratégie ne vous plait pas - du coup vous saurez comment la mettre en place sur une autre distribution si elle vous plait.

Retour à la table des matières de la section

1.1.2 - Le démarrage de Linux

Lorsque vous allumez votre ordinateur, après le chargement et l'exécution du BIOS, vous arrivez à GRUB.  GRUB signifie "Grand Unified Bootloader" – c'est un petit programme qui s'installe sur le MBR (Master Boot Record) et qui vous permet de choisir quel système d'exploitation vous voulez utiliser.  Par défaut, si vous appuyez simplement sur ENTER (ou si vous attendez quelques secondes sans rien faire), GRUB chargera Linux.

Les plus vieilles distributions de Linux utilisaient LILO (LInux LOader) pour remplir la même fonction.  GRUB est plus efficace et permet de démarrer à peu près n'importe quoi avec un grand niveau de flexibilité.

En démarrant, Linux monte son système de fichiers, charge tous les pilotes des périphériques et démarre tous les services, en vous indiquant par un "OK" que tout a bien fonctionné.  Si vous voyez un "FAILED" quelque part, c'est signe qu'une opération a échoué, mais ne paniquez pas, c'est fort probable que ça ne nous dérange pas pour l'instant (par exemple, problème de carte de son ou de carte réseau (on ne s'en servira pas encore de toute façon)).  Tant que vous atteignez l'écran de login, c'est déjà pas mal.

Par défaut, Ubuntu commence en mode graphique.  On peut passer à l'écran de login texte en faisant CTRL-Alt-F1.  De là, on peut revenir à l'écran de login graphique en faisant CTRL-Alt-F7.  En réalité, ce sont là deux consoles virtuelles différentes et on peut les utiliser en même temps, pour se loguer sous deux identités différentes si désiré, puis passer de l'une à l'autre en tout temps. Il existe également 5 autres consoles virtuelles texte qu'on peut atteindre en faisant CTRL-Alt-F2 à F6.

Retour à la table des matières de la section

1.1.3 - Mode texte vs graphique

Le "vrai" système d'exploitation Linux est en fait un OS console, un peu semblable à DOS mais en beaucoup plus puissant.  L'interface graphique (appelée X-Windows) est comparable (en terme de concept, pas en terme de puissance!) à ce bon vieux Windows 3.1.  À cette époque jurassique, DOS était le vrai système d'exploitation et on "démarrait" Windows lorsque nécessaire pour se donner une interface intéressante.  Linux fonctionne encore de cette façon et X-Windows est une couche par-dessus le véritable OS.

Dans le cadre de ce premier cours, nous allons principalement utiliser le mode console.  Vous aurez alors deux choix:

  • Vous loguer directement en mode console (plein-écran) en faisant CTRL-Alt-F1 à l'écran de login.
  • Vous loguer en mode graphique et ouvrir une fenêtre de terminal (grâce à l'application Terminal qui se trouve dans Applications->Accessoires.  Faites-vous un raccourci sur le bureau si vous trouvez ça pratique).

Le mode graphique est très similaire à une interface Windows, à peu de chose près.  On y trouve une barre des tâches (en bas) et un menu principal semblable au menu Démarrer (en haut).  On y retrouve également un équivalent au panneau de configuration (le menu Système), plusieurs applications de base et on fonctionne avec des icônes et des fenêtres – vous devriez être bien à l'aise avec tout ça sans devoir y passer beaucoup de temps.  C'est la raison pour laquelle on ne s'y attardera pas en classe.

Sachez simplement que dans le monde Linux, il y a deux "saveurs" de X-Windows:  Gnome et KDE.  Ubuntu est livré avec Gnome par défaut, une interface où le côté esthétique est plus développé que celle de KDE (qui est tout de même tout aussi conviviale).

Retour à la table des matières de la section

1.1.4 - Obtenir de l'aide

Il existe plusieurs façons d'obtenir de l'aide sur Linux - Internet est rempli de pages très bien faites et de forums fort actifs sur Linux. La communauté Linux est très accomodante, adore dépanner les débutants et partager son savoir - c'est là la conséquence de vivre dans un monde gratuit et open source!

Quelques sites intéressants à retenir:

De façon générale, cherchez "Linux", "bash" ou "Ubuntu" dans Google et vous trouverez des tas de sites intéressants.

Sinon, vous trouverez de la documentation à même votre serveur Linux:

  • la documentation des "packages" installés, qui se trouve souvent dans des sous-dossiers du dossier /usr/doc/
  • l’aide au sujet des commandes du shell est disponible à l’aide de la commande man bash (présumant que votre shell soit bash, ce qui est le cas par défaut)
  • l’aide au sujet d’une commande "commande" est accessible à l’aide de la commande man commande (évidemment, remplacez commande par la commande sur laquelle vous voulez de l'aide... Pressez "q" pour quitter)

Retour à la table des matières de la section

1.2 - Commandes de base - résumé rapide

Lorsque vous êtes dans une console texte (CTRL-Alt-F1) ou dans une fenêtre Terminal, vous interagissez avec bash, l'interpréteur de commandes par défaut dans le monde Linux. Il en existe d'autres, les plus populaires étant csh (C-Shell), tcsh (TC-Shell), ksh (Korn Shell) et bsh (Bourne Shell - d'ailleurs bash signifie Bourne Again Shell et c'est un désopilant jeu de mots sur Bourne Shell (du nom de son créateur) et "born again" qui signifie "renaître à une nouvelle religion").

Bash est notre interpréteur de commandes, comme CMD.EXE est celui de Windows et le bon vieux COMMAND.COM était celui de DOS (et des vieux Windows basés sur DOS).

Trois trucs intéressants pour gagner du temps dans bash:

  • La flèche vers le haut permet de remonter dans notre historique de commandes (et une fois qu'on a commencé à remonter on peut utiliser la flèche vers le bas pour redescendre). Différence avec Windows: Linux se souvient de notre historique de commandes (par défaut les 500 dernières) même si on se déconnecte ou qu'on éteint l'ordinateur. Chaque utilisateur a évidemment son propre historique, normalement stocké dans le fichier .bash_history dans son répertoire maison.
  • La touche TAB permet de faire de l'auto-complétion (désolé pour l'anglicisme, ne le dites pas à ma mère). Lorsqu'on tape le début d'un nom de répertoire ou de fichier et qu'on appuie sur TAB, Linux complète correctement ce nom (et met même un / après le nom s'il s'agit d'un répertoire). Si les quelques caractères que vous avez tapés ne permettent pas d'identifier un nom de façon unique, un bip se fera entendre. Appuyez alors sur TAB deux fois rapidement pour voir s'afficher une liste des noms qui commencent par les lettres que vous avez déjà entrées - vous pourrez alors continuer à taper quelques lettres puis réappuyer sur TAB une fois que vous aurez quelque chose d'unique.
  • Le point d'exclamation permet d'exécuter la dernière commande dans l'historique commençant par les caractères qui le suivent. Par exemple, si je fais !mk bash va exécuter la dernière commande commençant par "mk" que j'ai tapée (probablement un mkdir), telle qu'elle était (avec tous ses paramètres et switches).

Voici quelques commandes DOS/Windows et leur équivalent en Linux:

DOS

Linux

Notes

ATTRIB (+-)attr file

chmod <mode> file

complètement différentes

CD dirname\

cd dirname/

presque la même syntaxe

COPY file1 file2

cp file1 file2

presque la même syntaxe

DEL file

rm file

prudence - il n’y a pas de "undelete" ni de corbeille...

RMDIR /s dirname

rm -R dirname/

prudence - il n’y a pas de "undelete" ni de corbeille...

DIR

ls

pas exactement la même syntaxe

DIR file /S

find . -name file

complètement différentes

EDIT file

vi file

vous risquez de ne pas aimer :)

FORMAT

fdformat,
mount, umount

syntaxe très différente

HELP cmd

man cmd

même philosophie mais man donne des résultats beaucoup plus détaillés

MD dirname

mkdir dirname/

presque la même syntaxe

TYPE file | MORE

less file

beaucoup mieux

MOVE file1 file2

mv file1 file2

beaucoup mieux

NUL

/dev/null

beaucoup mieux

RD dirname

rmdir dirname/

presque la même syntaxe

REN file1 file2

mv file1 file2

pas pour de multiples fichiers à la fois

WIN

startx

deux mondes

Retour à la table des matières de la section

1.3 - Système de fichiers - notions préliminaires

  • Longueur des noms: un nom de fichier ou de répertoire peut avoir jusqu'à 255 caractères, avec autant de points qu'on veut.
  • Caractères interdits: tout comme dans Windows, certains caractères réservés ne peuvent pas être utilisés dans un nom de fichier (! * & > < | $ # entre autres)
  • Espaces: on peut mettre des espaces dans les noms, mais à ce moment il faudra placer le nom entre guillemets dans toutes les commandes qui l'utilisent. Pour cette raison, on ne l'utilise que très rarement.
  • Extensions: il n'y a pas de notion d'extension en Linux - l'OS ne se fie pas aux derniers caractères pour déduire le type du fichier. On utilisera toutefois souvent des extensions pour nous les pauvres humains mais pour Linux le point est un caractère comme un autre dans le nom et les lettres qui le suivent ne veulent rien dire de plus que celles qui le précèdent. Typiquement, un exécutable n'a pas d'extension du tout. Concrètement, Linux considère qu'un fichier est un exécutable si vous avez la permission d'exécution pour ce fichier.
  • Fichiers cachés: un fichier est "caché" lorsque son nom commence par un point. Par exemple: .Je.suis.un.fichier.caché. Lorsque l'on fait ls pour voir le contenu d'un répertoire, les fichiers cachés n'apparaîtront pas. Toutefois, ils ne sont pas cachés bien loin puisqu'il suffit de faire ls -a (a pour all, tous les fichiers) pour les voir apparaître. Le fait de cacher un fichier n'est donc pas pour des raisons de confidentialité (on a des permissions pour ça), mais simplement parce qu'on ne veut pas le voir tout le temps alors qu'on ne lui touchera pratiquement jamais. En plus, le joker * ne comprend pas les fichiers cachés, ce qui évite de les manipuler par erreur (par exemple si on fait rm * dans un répertoire). Les fichiers de configuration sont souvent cachés.
  • Liens symboliques: Linux supporte la notion de lien symbolique, comparable à la notion de raccourci en Windows mais qui n'a pas d'équivalent en DOS ou avec CMD.EXE. Un lien symbolique est un pointeur vers un fichier résident ailleurs. Démarrer ou ouvrir le lien va simplement démarrer ou ouvrir le fichier source réel. Le lien n'est donc pas une copie mais un raccourci. On peut les créer avec la commande ln -s (on verra les détails plus tard).
  • Les switches des commandes: une switche est un caractère que l'on peut passer à une commande pour modifier son comportement. En Windows les switches sont précédées d'un "/" comme ceci: dir /p. En Linux, les switches sont précédées d'un "-" comme ceci: ls -a. On peut regrouper plusieurs switches en un seul paquet préfixé d'un seul "-". Par exemple, ceci: ls -a -l -F est l'équivalent de ceci: ls -alF. Dans ce cas, l'ordre n'a normalement pas d'importance. En Linux, la plupart des commandes (même très simples) ont des tas de switches. Faites man pour les trouver.
  • Racine du système: un système Linux a une racine unique, appelée / (on utilisera des / plutôt que des \ partout dans les chemins Linux). Il n'y a aucune notion de lettre de lecteur ou de disque (comme C:) en Linux puisque chaque disque est monté dans l'arborescence unique à un point de montage quelconque et est accessible par un simple changement de répertoire (cd) de façon tout à fait transparente.
  • Répertoire maison: chaque usager sous Linux possède un répertoire maison qui lui appartient et dans lequel il stockera ses fichiers de configuration, son Bureau et ses documents personnels. Ce répertoire est normalement situé sous le répertoire /home et porte normalement le nom de l'usager (comme par exemple /home/georges). Le root est une exception, son répertoire maison est /root. Le répertoire /home n'est le répertoire maison de personne - c'est le répertoire où on stocke les répertoires maisons. Il est bien important de faire la différence entre /home et le répertoire maison d'un usager donné.
  • Chemins relatifs: le . et le .. ont la même signification qu'en Windows (respectivement le répertoire courant et le répertoire parent du répertoire courant) et peuvent être utilisés pour décrire des répertoires relatifs (par exemple ../../../bin)
  • Les espaces et les paramètres: Linux utilise l'espace pour séparer une commande de ses paramètres (et les paramètres les uns des autres). À cause de cette façon de faire, il faut absolument toujours laisser un espace après le nom de la commande et avant son premier paramètre. Par exemple, ceci n'est pas valide: cd.. il faut plutôt écrire cd ..

Retour à la table des matières de la section

1.4 - Deux commandes de base en plus de détails (cd et ls)

La commande ls fonctionne exactement comme le dir de Windows et permet de lister le contenu du répertoire courant ou d'un répertoire passé en paramètre. Elle possède tout un tas de switches que vous pourrez découvrir avec un simple man ls. Pour l'instant, il nous suffira de retenir:

  • ls -a: affiche tous les fichiers, incluant les fichiers cachés
  • ls -l: affiche un format long, donnant plus de détails sur chaque fichier

La différence principale entre ls et dir est la présence de couleur dans sa sortie. Les couleurs identifient les types de fichiers et les principales sont les suivantes:

  • Gris:  fichier ordinaire (genre texte)
  • Vert:  fichier exécutable
  • Bleu foncé:  répertoire
  • Bleu pâle (turquoise/cyan):  lien symbolique
  • Rouge sur fond noir:  lien symbolique qui pointe vers une cible inexistante (donc un lien mort)
  • Jaune:  fichier spécial de type périphérique (device)

La commande cd fonctionne également comme en Windows et permet simplement de changer de répertoire courant. Toutefois, quelques petites différences:

  • cd tout seul vous ramène instantanément à votre répertoire maison, qui que vous soyez
  • cd ~ fait la même chose
  • En fait, le ~ représente votre répertoire maison (normalement /home/usager), peu importe qui vous êtes. L'avantage du ~ est qu'on peut bâtir un chemin à partir de lui, comme par exemple ~/documents.
  • cd - défait le dernier cd qui a été fait (donc nous ramène au dernier endroit où on a été). Notez que de faire deux fois cd - nous laisse au même endroit puisque le deuxième annule le premier (cd - ne fonctionne pas comme un Undo de Word mais plutôt comme un bouton "last channel" d'une télécommande de télévision).

Retour à la table des matières de la section

1.5 - Permissions

1.5.1 - Comprendre les permissions

Il existe évidemment en Linux des permissions d'accès aux fichiers et aux répertoires, comparables à ce qu'on trouve sous NTFS (mais en beaucoup plus simple).

Lorsque vous faites ls -l dans un répertoire, vous obtenez bon nombre d'informations sur chaque fichier:

-rwxr-xr--  1  georges  comptables  27281 Aug 15 2007 liste

Dans l'ordre, on y lit:

  • Un caractère indiquant le type de fichier (- pour fichier, d pour répertoire (directory), l pour lien)
  • 9 caractères indiquant les droits d'accès au fichier (ici rwxr-xr--) - on verra plus loin comment les interpréter
  • Le nombre de "liens durs" (hard links, par opposition aux liens symboliques) sur ce fichier - pas important pour l'instant.
  • Le nom du propriétaire du fichier (ici georges)
  • Le nom du groupe propriétaire du fichier (ici comptables)
  • La taille du fichier en octets
  • La date de création ou de dernière modification
  • Le nom du fichier

Pour comprendre la fameuse ligne de droits d'accès, il faut savoir que:

  • Dans le monde Unix, tout fichier (ou répertoire, c'est pareil) a un propriétaire. Il est impossible d'avoir un fichier qui n'appartient à personne.
  • Tout usager fait nécessairement partie d'un groupe. Il peut être membre de plusieurs groupes à la fois, mais il ne peut pas être hors de tout groupe.
  • Tout fichier a un "groupe propriétaire". Les membres de ce groupe pourront bénéficier de droits supplémentaires si le propriétaire a décidé de leur en donner.

Lorsque Linux veut déterminer quels droits vous avez sur un fichier, il vérifie:

  1. Êtes-vous le propriétaire du fichier, tel qu'indiqué au 4ème champ dans ls -l?
  2. Sinon, êtes-vous membre du groupe propriétaire, tel qu'indiqué au 5ème champ?
  3. Sinon, vous êtes automatiquement considéré comme un des "autres".

Vous avez toujours trois choix quant à votre relation par rapport à un fichier: vous êtes le propriétaire, vous êtes membre du groupe propriétaire ou vous êtes un des autres (sans lien particulier avec le fichier).

C'est pour cette raison que la ligne de droits d'accès à un fichier contient 3 triplets: rwxr-xr-- peut être séparé en trois groupes de trois caractères: rwx, r-x et r--. Chacun de ces triplets correspond à vos droits si vous êtes (respectivement) le propriétaire, membre du groupe propriétaire, un des autres.

Il ne nous reste plus qu'à comprendre la signification des caractères dans un triplet pour pouvoir deviner qui a le droit de faire quoi sur un fichier. C'est extrêmement simple:

  • r (read): le droit de lire le contenu du fichier ou du répertoire
  • w (write): le droit de modifier le contenu du fichier ou du répertoire
  • x (execution): le droit d'exécuter le fichier (ou de traverser le répertoire)
  • - : un tiret à l'endroit où une lettre devrait se trouver signifie qu'on ne possède pas le droit qui irait là

Par exemple, pour le fichier liste montré plus haut:

  • georges est le propriétaire, il regarde donc le premier triplet et constate qu'il a tous les droits sur le fichier (rwx)
  • les membres du groupe comptables ont un accès privilégié au fichier, ils regardent donc le deuxième fichier pour découvrir qu'ils ont le droit de lire et d'exécuter le fichier, mais pas de le modifier (r-x)
  • les autres (qui ne sont ni georges ni des comptables) regardent le troisième triplet et s'aperçoivent qu'ils n'ont que le droit de lire le fichier (r--)

Quelques notes pour compléter ces notions:

  • Le droit x pour un répertoire nous donne le droit de le traverser (sans nécessairement en voir le contenu). En effet, un répertoire ne s'exécute pas alors le x est utilisé différemment. Traverser un répertoire signifie pouvoir y entrer (avec un cd), soit pour y faire quelque chose (si on a d'autres droits), soit pour se déplacer dans un de ses sous-répertoire (avec un autre cd). Notez que même si on tente d'atteindre directement un sous-répertoire, on doit tout de même posséder le droit de traverser les répertoires intermédiaires. Par exemple, cd /home/georges/allo sera fonctionnel seulement si j'ai le droit de traverser la racine (/), le répertoire home, le répertoire georges et le répertoire allo, même si je ne m'arrête nulle part en chemin.
  • Le droit r pour un répertoire signifie que je peux lire la liste des fichiers qui s'y trouvent. Si je ne possède que cet unique droit pour un répertoire, je ne pourrai pas m'y déplacer ni en modifier le contenu d'aucune façon, mais je pourrai lister le contenu du répertoire à partir d'ailleurs. Je ne pourrai toutefois pas connaître les permissions des fichiers qui s'y trouvent ni en lire le contenu et ce peu importe les droits que j'ai sur ces fichiers individuels.
  • Le droit w pour un répertoire signifie que je peux y créer des fichiers ou modifier les fichiers qui s'y trouvent (incluant les effacer) et ce, peu importe les droits individuels que j'ai sur ces fichiers. C'est donc un droit très important et il convient de ne pas le donner à la légère!
  • L'absence du droit w pour un fichier n'est pas une bonne mesure de sécurité pour en empêcher la modification. En effet, lorsque l'on tente de modifier ou même d'effacer un fichier pour lequel on ne possède pas le droit w, on nous demandera simplement si on est certain de vouloir effectuer l'opération. Si on répond oui, c'est fait! Le droit w sur un fichier est plus une protection contre des erreurs malencontreuses qu'une vraie mesure de sécurité. Pour empêcher un usager de modifier ou d'effacer un fichier, je dois en plus lui retirer le droit w sur le répertoire qui le contient.

Retour à la table des matières de la section

1.5.2 - Modifier les permissions

Il faut d'abord savoir que la seule personne autorisée à modifier les permissions sur un fichier/répertoire donné est son propriétaire, et ce peu importe les permission qui lui sont accordées ou qui sont accordées aux autres. La seule exception à cette règle est évidemment root, qui peut tout faire sur son système.

Il existe trois commandes pour modifier les permissions sur un fichier:

  • chown (pour change owner, changer le propriétaire): chown <nouveau propriétaire> <fichier> permet de donner le fichier <fichier> à l'usager <nouveau propriétaire>. On perd du coup le droit de modifier les permissions de ce fichier.
  • chgrp (pour change group, changer le groupe): de la même façon chgrp <nouveau groupe> <fichier> permet de donner le fichier <fichier> au groupe <nouveau groupe>, en faisant alors le nouveau groupe propriétaire. Lors de la création d'un nouveau fichier ou répertoire, le groupe propriétaire est toujours le groupe primaire de l'usager qui l'a créé. Après coup, le propriétaire pourra le changer pour n'importe quoi, y compris pour le donner à un groupe dont il n'est même pas membre.
    • Notez que l'on peut utiliser chown ainsi: chown <nouveau propriétaire>:<nouveau groupe> <fichier>, ce qui nous permet de changer d'un seul coup le propriétaire et le groupe. N'oubliez pas le ":" entre les deux.
  • chmod (pour change mode, changer le mode d'accès): permet de modifier les droits rwx pour un fichier donné.

Il existe deux façons d'utiliser chmod: la façon relative (qui enlève ou ajoute des droits à ceux déjà présents) et la façon absolue (qui redéfinit complètement les droits d'un seul coup).

La syntaxe de la façon relative est la suivante:

chmod <quiXperm> <fichier>

Dans cette syntaxe:

  • qui: représente à qui on veut modifier les droits. On peut utiliser u pour user (propriétaire), g pour groupe et o pour others (les autres), a pour all (tout le monde) ou une combinaison de lettres comme ug ou go. Notez que a est l'équivalent de ugo.
  • X est un opérateur qui peut être soit - (pour enlever des droits) ou + (pour en ajouter)
  • perm: représente les permissions à enlever ou à ajouter à "qui". On peut utiliser r, w, x ou une combinaison de ces trois lettres.

Par exemple:

  • chmod u-w liste enlève le droit d'écriture au propriétaire du fichier liste
  • chmod go+rx liste ajoute les droits de lecture et d'exécution au groupe et aux autres sur le fichier liste
  • chmod ugo+rwx liste donne tout les droits à tout le monde sur le fichier liste
  • chmod a+rwx liste fait la même chose

Notez que l'on peut cumuler plusieurs modifications en une même commande en les séparant par des virgules comme ceci: chmod u-w,go+rx,g+w liste.

La syntaxe de la façon absolue est la suivante:

chmod <nombre en octal> <fichier>

Le nombre est octal est composé de trois chiffres de 0 à 7 représentant respectivement les droits donnés au propriétaire, au groupe et aux autres.

Pour former chacun des nombres, on attribue simplement le chiffre 4 à la permission r, le chiffre 2 à la permission w et le chiffre 1 à la permission x. On additionne ensuite les chiffres correspondants aux droits que l'on veut donner.

Par exemple: 7 équivaut à tous les droits (rwx - 4+2+1). 5 équivaut au droit de lire et d'exécuter (r-x - 4+1) et 0 équivaut à aucun droit (---).

On fait la même chose pour chacun des triplets et on "colle" les trois chiffres ensemble pour obtenir le nombre final.

Par exemple: 755 équivaut à tous les droits pour le propriétaire, le droit de lire et d'exécuter pour les membres du groupe propriétaire et les autres. 750 équivaut à tous les droits pour le propriétaire, le droit de lire et d'exécuter pour les membres du groupe propriétaire et aucun droit pour les autres. 666 équivaut au droit de lire et d'écrire pour tout le monde (en plus d'être le nombre de la bête).

Retour à la table des matières de la section

1.6 - Les liens

Il existe deux catégories de liens sous Linux: les liens symboliques et les liens "durs" (hard links).

Un lien dur est carrément un autre nom pour un fichier. Chaque lien dur est stocké dans la table des fichiers (appelée table des inodes) et pointe vers les mêmes blocs physiques du disque. Un lien dur ne peut pas exister sans sa cible et un fichier n'est effacé que quand tous ses liens durs sont effacés.

La seule indication qu'un fichier est un lien dur est visible dans ls -l: le nombre de liens durs est plus grand que 1. Notez que ce nombre sera le même chez tous les liens durs, puisque ces liens sont en fait le même fichier (c'est très philosophique comme concept, ça rappelle le principe de la Sainte Trinité...).

Une fois les liens créés, une bonne façon d'identifier ce qui pointe vers quoi est de faire ls -i (ou plus clair encore ls -il), ce qui affiche le numéro d'index (le inode) de chaque fichier. Deux fichiers ayant le même inode sont deux liens durs vers le même fichier. Il est impossible alors de savoir lequel est l'original et lequel est le lien (en fait, les deux sont des liens!).

Si on efface un lien dur, le fichier en tant qu'entité physique continue d'exister tant qu'il y a d'autres liens qui pointent vers lui.

On verra souvent le mot "unlink" (délier) comme synonyme d'effacer puisque pour effacer un fichier, il faut le délier en détruisant tous les liens durs qui pointent vers le fichier physique.

Pour créer un lien dur il suffit de faire: ln <cible> <nom du lien dur>

Un lien symbolique est bien différent et ressemble beaucoup plus au concept de raccourci de Windows. C'est un fichier spécial de type "l" (lien), ayant son propre inode et qui pointe vers le inode de son fichier cible. Un lien symbolique peut exister même si sa cible disparait et une cible peut être effacée même s'il existe des liens symboliques qui pointent vers elle.

Un lien symbolique qui pointe vers une cible qui n'existe pas (ou qui n'existe plus) est souvent appelé lien orphelin ou lien mort.

Un lien symbolique est très facile à identifier: ls le colore en bleu pâle (cyan) et ls -l met un "l" comme type de fichier et indique carrément avec une flèche (->) vers quoi il pointe.

Pour créer un lien symbolique, on fait simplement: ln -s <cible> <nom du lien>

Quel est l'intérêt d'utiliser un type de lien plutôt qu'un autre? Tout dépend de ce que l'on veut faire (il y a certaines préoccupations de performances que l'on peut voir résumées ici) mais la plupart du temps on fonctionnera avec un lien symbolique, ce qui est beaucoup plus simple à manipuler.

Retour à la table des matières de la section

1.7 - Les jokers

Un joker (souvent appelé wildcard ou caractère générique) est un caractère qui en remplace un ou plusieurs autres. Un joker est utilisé dans la création d'un masque qui permet d'affecter plusieurs fichiers avec une seule commande.

Il existe trois jokers en linux:

  • Le point d'interrogation ?
  • L'astérisque *
  • Les crochets []

Le point d'interrogation remplace exactement un caractère quelconques, pas plus, pas moins. Par exemple, si je fais ceci:

j'efface d'un seul coup les fichiers allo1.txt, allo2.txt et alloa.txt mais pas allo.txt ni allo10.txt ni allotoi.txt.

L'astérisque remplace zéro, un ou plusieurs caractères quelconques. Par exemple, si je fais:

    rm allo*.txt

j'efface d'un seul coup les fichiers allo1.txt, allo2.txt, alloa.txt, allo.txt, allo10.txt et allotoi.txt. J'efface également les fichiers allo.important.txt et allo.txt.txt.txt.

Il ne faut pas oublier que pour Linux, le point est un caractère comme un autre et que le concept d'extension n'existe pas pour lui... Même si dans notre exemple, les fichiers finissaient par ".txt" pour qu'un utilisateur se rappelle qu'il s'agit de fichiers texte (à cause d'une vieille habitude Microsoftienne), pour Linux ça ne veut absolument rien dire. Alors si je fais:

    rm allo*

j'efface d'un seul coup allo.txt, alloToiLeJeune, allo.doc, allo et allophones.tar.gz. L'astérisque peut donc remplacer un nombre indéfini de caractères, incluant un nombre indéfini de points. C'est pourquoi, si je veux effacer le contenu complet d'un répertoire, je ferai:

    rm *

et non pas:

    rm *.*

comme je suis habitué de faire en DOS. Comme le point ne représente rien de spécial pour Linux, rm * efface tous les fichiers peu importe leur nom alors que rm *.* efface tous les fichiers qui ont un point quelque part dans leur nom (sur certaines distributions et avec certaines commandes ça inclut "." et ".." qui sont présents dans tous les répertoires alors soyez vigilants!).

rm * efface donc d'un coup tous les fichiers, à une exception près: les fichiers cachés ne sont pas pris en compte par *. Même si logiquement et sémantiquement ils devraient l'être, c'est une exception qui a été ajoutée au système justement pour donner une raison de cacher des fichiers... Si on veut effacer les fichiers cachés, on devra être explicites et faire:

    rm .*

Ainsi on demande d'effacer tout ce qui commence par un point, suivi de n'importe quoi d'autre. Ceci inclut les répertoires "." et ".." alors soyez vigilants! (Dans ce cas-ci, rm n'affecte pas les répertoires donc tout ce que arrivera sera deux messages d'erreurs - pas trop grave comme conséquence. Toutefois certaines autres commandes peuvent les affecter et causer certains problèmes).

Le dernier joker est la paire de crochets. Même si ce sont en fait deux caractères, on les considérera comme un seul joker puisque l'un ne va pas sans l'autre.

La paire de crochets remplace un et un seul caractère, pas plus pas moins, un peu comme le point d'interrogation. Toutefois, plutôt que de remplacer n'importe quel caractère, elle remplace un des caractères entre les crochets. Par exemple, ceci:

    rm allo[12345].gz

effacera les fichiers allo1.gz, allo2.gz, allo3.gz, allo4.gz et allo5.gz. Les fichiers allo.gz, allo12.gz et alloToi.gz ne seront pas effacés.

On peut également placer une plage de valeur entre les crochets, comme ceci:

    rm allo[0-9]

Ceci efface les fichiers allo0 à allo9 et aucun autre.

Il est possible de placer plusieurs plages de valeurs, mélangées avec des valeurs unitaires, comme ceci:

    rm allo[0-9A-Zd]

Ceci effacera les fichiers dont le nom commence par allo et se termine soit par un chiffre, soit par une lettre majuscule ou soit par un d minuscule, avec rien entre les deux. Par exemple allo1, alloR et allod mais pas allo1d ni allodd.

On peut bien entendu mélanger plusieurs jokers dans un même masque pour obtenir quelque chose de complexe comme "tout fichier qui commence par une lettre (majuscule ou minuscule) et qui finit par un chiffre, avec n'importe quoi entre les deux:

    [a-zA-Z]*[0-9]

Évidemment ce genre de masque est rarement utilisé puisque rarement approprié, mais il est toujours possible de s'en servir si on a un intérêt!

Retour à la table des matières de la section

1.8 - Les redirections

Il faut savoir qu'en Linux il existe trois "canaux" impliqués dans toute exécution (que ce soit l'exécution d'une commande ou celle d'un programme plus complexe):

  • Le canal d'entrée standard (stdin - normalement le clavier, qui fournit des données au programme)
  • Le canal de sortie standard (stdout - normalement l'écran, qui affiche ce qui sort du programme)
  • Le canal d'erreur standard (stderr - normalement l'écran aussi, qui affiche des messages d'erreurs sortant du programme. Linux traite les messages d'erreurs différemment que le reste de la sortie).

On peut si désiré rediriger un de ces canaux vers autre chose que son périphérique standard. L'usage le plus répandu de la redirection est de rediriger la sortie d'une commande ou d'un programme vers un fichier texte pour pouvoir la consulter à loisir plus tard. On fait cela avec l'opérateur ">". Par exemple:

    ls -l /etc > ~/fichier

liste le contenu du répertoire /etc, en format long. Plutôt que d'afficher ce contenu à l'écran, Linux va plutôt l'envoyer dans le fichier ~/fichier, c'est à dire fichier dans mon répertoire maison. Si ce fichier existait, il sera écrasé par le nouveau contenu, sinon il sera créé sur-le-champ.

Ceci est une bonne façon de créer rapidement un fichier texte avec du contenu si on en a besoin pour des tests et que le contenu exact n'est pas important.

On peut décider de rediriger la sortie de la même façon mais d'ajouter à la fin du fichier s'il existait déjà (plutôt que de l'écraser). On peut utiliser pour cela l'opérateur ">>". Par exemple:

    ls -l /etc >> ~/fichier

Cette façon de faire est idéale pour bâtir un fichier de log qu'on veut consulter plus tard.

Comme les messages d'erreur sont envoyés sur un canal à part, ceux-ci atteindront quand même l'écran et ne seront pas envoyés dans le fichier. Pour rediriger le canal d'erreur, on utilisera l'opérateur "2>" comme ceci:

    ls -l /etc 2> ~/fichier

Dans ce cas-ci, seuls les messages d'erreurs seront redirigés vers le fichier, pas la sortie standard. Il est possible de rediriger les deux en faisant ceci:

    ls -l /etc > ~/fichier 2> ~/fichier

Notez que dans ce cas, les deux canaux seront redirigés vers le même fichier. Bien qu'il soit possible de les rediriger dans des fichiers différents, c'est rarement ce que nous ferons. Comme le fait de rediriger ces deux canaux vers le même fichier est une opération fort courante, on peut utiliser "2>&1" qui redirge le deuxième canal (l'erreur) vers le premier (la sortie standard), comme ceci:

    ls -l /etc > ~/fichier 2>&1

Autre opération moins répandue: on peut rediriger un fichier vers l'entrée standard, remplaçant le clavier, avec l'opérateur "<". Lorsque le programme attendra que l'usager tape quelque chose, il ira plutôt lire une ligne dans le fichier. Ceci peut être utilisé lorsque l'on veut automatiser une processus qui demande des actions de l'usager. Par exemple:

    program < ~/fichier

Finalement, le dernier type de redirection (qui est très puissant) est le pipe (en anglais, pour tuyau), représenté par le symbole "|". Le pipe redirige la sortie d'un programme vers l'entrée d'une autre commande. Il n'y a aucun fichier d'impliqué dans cette opération.

Ceci nous permet de lier plusieurs commandes entre elles et donc d'utiliser plusieurs petits outils simples pour en créer un complexe. Un des usages les plus courant est le pipe vers less. less affiche son entrée à l'écran mais insère une pause à chaque écran. De plus, il permet la recherche de mot-clés et le retour en arrière.

Si je tape less fichier, le fichier sera affiché à l'écran par less. Mais que faire si ce que je veux afficher un écran à la fois est le résultat d'une commande? Je peux faire ceci:

    ls -Rl / | less

J'affiche ici le contenu du répertoire / (la racine), en format long et de façon récursive (donc le contenu de tous les répertoires du système de fichiers!). Le pipe à less redirige la sortie de ls à less au lieu de l'envoyer à l'écran. C'est less qui l'enverra alors à l'écran, en nous permettant de contrôler le débit!

Retour à la table des matières de la section